home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / ada / gwuada_7.zip / ADAHELP.C < prev    next >
Text File  |  1993-12-01  |  30KB  |  1,071 lines

  1. /*
  2.  
  3.   HELP ENGINE PARA GWADA
  4.  
  5.   Módulo ADAHELP.C
  6.   Programa para mostrar helps referentes à linguagem ADA.
  7.   O arquivo de help GWADA.HLP deve ser gerado através do
  8.   programa ADAHCONV.EXE.
  9.  
  10.   Trabalho de conclusao
  11.   Bacharelado em Informática
  12.  
  13.   Ulrich Peters
  14.   Rafael Presotto
  15.   Jerry Dressler
  16.  
  17.   Revisoes:
  18.     /03 Início do trabalho
  19.     /04 Reformulaçao completa do sistema de acesso ao help, definiçao do
  20.     ambiente da Help-Engine (janela/sombra/botoes...)
  21.     /05 Introduçao das funçoes de mouse
  22.     /06 Barra de rolagem e ativaçao desta pelo mouse, testes dos desvios
  23.     /08 Testes com alocaçao estática/dinâmica de memória - erro
  24.     provável no tamanho do registro de linha de help
  25.   15/08 Verificaçao do sistema gráfico acoplado - atributos de sublinhado
  26.     e highlight para monitores MDA/Hercules e cores para sist. coloridos
  27.   09/09 Revisao das funçoes do mouse para o caso de driver nao estar instalado
  28.   13/09    Volta para a mesma posiçao (scroll) anterior ao ativar ALT-F1,
  29.     modificaçao das mensagens de erro, início das procuras por strings
  30.     passados como parâmetro de chamada
  31.   16/09 Correçao no vetor de chamadas de help (31 posiçoes em vez de 30!)
  32.     /10 Excecuçao da procura de tokens, montar tokenbuffer (help virtual) para
  33.     o string passado como parâmetro, desvio direto para help se houver
  34.     apenas um desvio localizado.
  35.     /11 Revisao completa nas estruturas de alocacao dinâmica e testes finais
  36. */
  37.  
  38. #include <stdio.h>
  39. #include <stdlib.h>
  40. #include <conio.h>
  41. #include <string.h>
  42. #include <alloc.h>
  43. #include <dos.h>
  44. #include <ctype.h>
  45. #include "..\source\gwadahlp.h"
  46. #include "..\source\adavio.h"
  47. #include "..\source\mouse.h"
  48.  
  49. #define destaca_desvio(pointer)  (VioColor(pointer->screen_Xi,pointer->screen_Y+scroll, pointer->screen_Xf,pointer->screen_Y+scroll, attrib.select))
  50. #define desmarca_desvio(pointer) (VioColor(pointer->screen_Xi,pointer->screen_Y+scroll, pointer->screen_Xf,pointer->screen_Y+scroll, attrib.desvio))
  51.  
  52. /* Estrutura usada para guardar uma linha de texto de auxílio */
  53. typedef struct helpline
  54. {
  55.  struct helpline *prox;
  56.  char    helptext[77];
  57. };
  58.  
  59. /* Estrutura única para guardar os vários atributos de cor usados */
  60. typedef struct cores
  61. {
  62.  char normal;    /* texto normal do help */
  63.  char hilight;  /* texto destacado */
  64.  char desvio;   /* texto de desvio */
  65.  char dimmed;   /* texto escuro (inativo) */
  66.  char select;   /* texto selecionado */
  67.  char slider0;  /* barra de rolagem */
  68.  char slider1;  /* cursor da barra de rolagem */
  69. };
  70.  
  71. /* listas globais */
  72. struct desvio *desvio_mostrado;
  73. struct helpline *hlptxt;
  74. struct cores attrib;
  75.  
  76. int chamadas[31];    /* vetor das chamadas efetuadas p/ backtracking */
  77. int cham_scr[31];       /* vetor da posiçao do help na tela */
  78. int chmds;        /* número de chamadas de helps anteriores */
  79.  
  80. /* outras variáveis globais */
  81. FILE *help;            /* arquivo GWADA.HLP */
  82. int mouse=0;            /* controle: driver instalado? */
  83. int ha_desvio;
  84. int sliderpos;            /* posiçao do slider */
  85. int ALT_F1, TAB, ENTER;        /* variáveis para controlar os buttons */
  86. int scroll_pos;            /* posiçao do help na tela */
  87. char far *tokenbuffer;        /* buffer que simula help de tokens achados */
  88. int tokenlines;            /* linhas achadas por search() */
  89.  
  90. /* Funçoes de controle do mouse */
  91. void mouse_on(void)
  92. {
  93.  if (mouse)
  94.   mouse_enable();
  95. }
  96.  
  97. void mouse_off(void)
  98. {
  99.  if (mouse)
  100.   mouse_disable();
  101. }
  102.  
  103. /* Rotina para terminar com erro */
  104. void end(char *texto, int exitcode)
  105. {
  106.  int posicao;
  107.  char pre[70];
  108.  if (texto != "")
  109.  {
  110.   if (exitcode != 2)
  111.    strcpy(pre,"Memory Fault: ");
  112.   else
  113.    strcpy(pre,"");
  114.   strcat(pre,texto);
  115.   posicao = 40-strlen(pre)/2;
  116.   VioSombra(posicao-1,9,45+(40-posicao),13);
  117.   VioFill(posicao-3,8,43+(40-posicao),12,' ',0x4F);
  118.   VioFrame(posicao-3,8,43+(40-posicao),12,0,0x4F);
  119.   VioPrint(posicao,10,0x4F,0,pre);
  120.   while (! kbhit());
  121.  }
  122.  while (kbhit())
  123.   posicao = getch();    /* Limpar buffer do teclado */
  124.  VioWinClose(1);    /* Fechar janela e restaura tela */
  125.  _setcursortype(_NORMALCURSOR); /* retornar cursor */
  126.  exit(exitcode);
  127. }
  128.  
  129. /* Sinal acústico para erro */
  130. void beep(void)
  131. {
  132.  sound(500);
  133.  delay(10);
  134.  nosound();
  135. }
  136.  
  137. /* Buscar lista de helps disponíveis do disco
  138.    (Informaçoes do cabeçalho do arquivo)      */
  139. void ler_nodos(void)
  140. {
  141.  int qtde;    /* número de nodos */
  142.  int i;
  143.  struct tree *nodo_antes;
  144.  
  145.  raiz = NULL;
  146.  fread(&qtde,2,1,help);        /* recuperar número de nodos do arquivo */
  147.  nodo_antes = NULL;
  148.  nodo_atual = malloc(sizeof(struct tree));
  149.  for (i=0;i<qtde;i++)        /* recuperar os nodos no início do help */
  150.  {
  151.   fread(&nodo_atual->number,2,1,help);
  152.   fread(&nodo_atual->lines,2,1,help);
  153.   fread(&nodo_atual->size,4,1,help);
  154.   fread(&nodo_atual->offset,4,1,help);
  155.   nodo_atual-> prox = NULL;
  156.   if (raiz == NULL) raiz = nodo_atual;
  157.   nodo_antes = nodo_atual;
  158.   nodo_atual = malloc(sizeof(struct tree));
  159.   nodo_antes->prox = nodo_atual;
  160.  }
  161.  nodo_antes->prox = NULL;
  162.  free(nodo_atual);        /* eliminar a última criaçao de nodo */
  163. }
  164.  
  165. /* Extrair do buffer de memória o texto do help,
  166.    montando a lista encadeada dos desvios e
  167.    a lista de texto de help (scrolling)        */
  168. void process_buffer(char far *buffer, int linhas)
  169. {
  170.  int pos, n, x, i;
  171.  char numero[5];
  172.  struct helpline *texto, *linha_anterior;
  173.  
  174.  /* Inicializa ponteiros da listas */
  175.  hlptxt = NULL; /* raiz dos helps */
  176.  draiz = NULL;  /* raiz dos desvios */
  177.  braiz = NULL;  /* raiz dos brancos */
  178.  linha_anterior = NULL;
  179.  desvio_antes = NULL;
  180.  branco_antes = NULL;
  181.  i=0;
  182.  
  183.  for (x=0;x<linhas;x++)
  184.  {
  185.   /* alocar memória para a texto */
  186.   texto = (struct helpline *)farmalloc(sizeof(struct helpline));
  187.   if (texto == NULL)
  188.    end("HELPLINE",1);
  189.   pos = 0;
  190.   while (buffer[i] != '\n')
  191.   {
  192.    if (buffer[i] == '\\')    /* início de sequência de controle */
  193.    {
  194.     switch (buffer[++i])
  195.     {
  196.      case 'u' : /* alocar nodo na árvore de brancos */
  197.         i++;
  198.         branco_atual = (struct branco *)farmalloc(sizeof(struct branco));
  199.         if (branco_atual == NULL)
  200.          end("HILIGHTED TEXT LIST",1);
  201.         branco_atual->screen_Xi = pos+2;
  202.         branco_atual->screen_Y  = x+2;    /* 2 = margem da moldura! */
  203.         while ((buffer[i] != '\\')&&(pos < 76))
  204.          texto->helptext[pos++] = buffer[i++];
  205.         branco_atual->screen_Xf = pos+1;
  206.         i += 2;
  207.         branco_atual->prox = NULL;
  208.         if (braiz == NULL)
  209.          braiz = branco_atual;
  210.         if (branco_antes != NULL)
  211.          branco_antes->prox = branco_atual;
  212.         branco_antes = branco_atual;
  213.         break;
  214.      case 'v' : /* alocar nodo da arvore de desvios */
  215.         i++;
  216.         desvio_atual = (struct desvio *)farmalloc(sizeof(struct desvio));
  217.         if (desvio_atual == NULL)
  218.          end("TRANSFER LIST",1);
  219.         desvio_atual->screen_Xi = pos+2;
  220.         desvio_atual->screen_Y  = x+2;    /* 2 = margem da moldura! */
  221.         while ((buffer[i] != '\\')&&(pos < 76))
  222.          texto->helptext[pos++] = buffer[i++];
  223.         desvio_atual->screen_Xf = pos+1;
  224.         i += 2;            /* pular o '\v' */
  225.         /* extrair o número do desvio */
  226.         n=0;
  227.         while (buffer[i] != '.')
  228.         numero[n++] = buffer[i++];
  229.         i++;            /* pular o '.' */
  230.         numero[n] = '\0';
  231.         desvio_atual->number = atoi(numero);
  232.         if (numero == 0)    /* linha invalida: apaga destaque */
  233.          free(desvio_atual);
  234.         else
  235.         {
  236.          desvio_atual->prox = NULL;
  237.          if (draiz == NULL)
  238.           draiz = desvio_atual;
  239.          if (desvio_antes != NULL)
  240.           desvio_antes->prox = desvio_atual;
  241.          desvio_antes = desvio_atual;
  242.         }
  243.         break;
  244.  
  245.     }
  246.    }
  247.    if (pos < 76)
  248.     texto->helptext[pos++] = buffer[i];
  249.    i++;
  250.   }
  251.   /* encontrou um caractere \n */
  252.   i++;
  253.   if (pos)
  254.    texto->helptext[pos-1] = '\0';
  255.   else
  256.    texto->helptext[pos] = '\0';
  257.   texto->prox = NULL;
  258.   if (hlptxt == NULL)
  259.    hlptxt = texto;
  260.   if (linha_anterior != NULL)
  261.    linha_anterior->prox = texto;
  262.   linha_anterior = texto;
  263.  }
  264. }
  265.  
  266. /* Funçoes de controle da régua de botoes */
  267. void tab(int ativar)
  268. {
  269.  mouse_off();
  270.  if (ativar)
  271.  {
  272.   TAB = 1;
  273.   VioColor(36,21,41,21,attrib.desvio); /* TAB ativo */
  274.  }
  275.  else
  276.  {
  277.   TAB = 0;
  278.   VioColor(36,21,41,21,attrib.dimmed); /* TAB inativo */
  279.  }
  280.  mouse_on();
  281. }
  282.  
  283. void enter(int ativar)
  284. {
  285.  mouse_off();
  286.  if (ativar)
  287.  {
  288.   ENTER = 1;
  289.   VioColor(52,21,57